package 力扣面试经典150;

/**
 * Created with IntelliJ IEDA.
 * Description:
 * User:86186
 * Date:2024-03-12
 * Time:14:47
 */

import java.util.Stack;

/**
 * 力扣面试经典150:73. 矩阵置零
 * 中等
 * 相关标签
 * 相关企业
 * 提示
 * 给定一个 m x n 的矩阵，如果一个元素为 0 ，则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
 * 示例 1：
 * 输入：matrix = [[1,1,1],[1,0,1],[1,1,1]]
 * 输出：[[1,0,1],[0,0,0],[1,0,1]]
 * 示例 2：
 * 输入：matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
 * 输出：[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
 */
public class setZeroes {
    public static void main(String[] args) {
        setZeroes(new int[][]{{0,1,2,0},{1,4,5,2},{1,3,1,5}});
    }
    public static void setZeroes(int[][] matrix) {
//       执行用时分布
//1ms
//击败36.04%使用 Java 的用户
//消耗内存分布
//44.59MB
//击败42.96%使用 Java 的用户
//        int m = matrix[0].length;
//        int n = matrix.length;
//        int[][] arr = new int[n][m];
//        for (int i = 0;i  < n;i++){
//            for (int j = 0; j < m; j++) {
//                arr[i][j] = matrix[i][j];
//            }
//        }
//        for(int i = 0;i < n;i++){
//            for(int j = 0;j < m;j++){
//                if(matrix[i][j] == 0){
//                    for(int k = 0;k < m;k++){
//                        arr[i][k] = 0;
//                    }
//                    for(int k = 0;k < n;k++){
//                        arr[k][j] = 0;
//                    }
//                }
//            }
//        }
//        for (int i = 0;i  < n;i++){
//            for (int j = 0; j < m; j++) {
//                matrix[i][j] = arr[i][j];
//            }
//        }
        /**
         * 执行用时分布
         * 1ms
         * 击败36.04%使用 Java 的用户
         * 消耗内存分布
         * 44.68MB
         * 击败15.41%使用 Java 的用户
         * 空间复杂度O(mn)O(mn)O(mn)
         */
//        int m = matrix.length;
//        int n = matrix[0].length;
//        Stack<int[]> stack = new Stack<>();
//        for (int i = 0; i < m; i++) {
//            for (int j = 0; j < n; j++) {
//                if (matrix[i][j] == 0)
//                    stack.push(new int[]{i, j});
//            }
//        }
//        while (!stack.isEmpty()) {
//            int[] temp = stack.pop();
//            for (int i = 0; i < n; i++)
//                matrix[temp[0]][i] = 0;
//            for (int i = 0; i < m; i++)
//                matrix[i][temp[1]] = 0;
//        }
        int m = matrix.length;
        int n = matrix[0].length;
        //标记为0的位置的坐标，此布尔数组用于置列为0
        boolean[] col = new boolean[n];
        for(int i = 0;i < m;i++){
            //标志位，用来标志行
            boolean flag = false;
            for(int j = 0;j < n;j++){

                if(matrix[i][j] == 0){
                    flag = true;
                    col[j] = true;
                }
            }
            if(flag == true){
                for(int k = 0;k < n;k++)matrix[i][k] = 0;
            }
        }
        for(int i = 0;i < n;i++){
            if(col[i]){
                for(int j = 0;j < m;j++){
                    matrix[j][i] = 0;
                }
            }
        }
    }
}
